--[[ 编码: GK-API-06 名称: 出库单创建接口 作者: DJW 日期: 2025-5-14 入口函数: Main 功能说明: 1. 接收上游系统的入库任务XML数据 2. 检查入库单是否已存在 3. 创建Outbound_Order主表和Outbound_Detail子表记录 4. 返回处理结果 输入XML示例: SIMPLIFIED CHINESE 0 TASK20000001 normal 2025050602 BCH1001 CGKHTY CGKHTY 2025-05-06 0 1 XR33201-2L080B AVL 2 PHI00000000000001309 YL201125 2016-04-23 2099-12-31 国食药监械(准)字2012 2 KH32803017 AVL 5 PHI00000000000001308 YL2011256 2023-04-23 2099-12-31 --]] wms_base = require("wms_base") xml = require("oi_base_xml") xml2lua = require("xml2lua") -- 创建出库单主表记录 local function create_outbound_order(strLuaDEID, order_data) local order = m3.AllocObject(strLuaDEID, "Outbound_Order") local nRet1,CONST_FACTORY= wms_base.Get_sConst2(strLuaDEID,"GK_Default_Factory"); --默认工厂标识 local nRet2,CONST_WH= wms_base.Get_sConst2(strLuaDEID,"GK_Default_Warehouse"); if nRet1 ~= 0 or nRet2 ~= 0 then return 1, "获取工厂或仓库常量失败" end -- 主表字段映射 order.no = order_data.taskId order.bs_type = order_data.taskType order.bs_no = order_data.orderNo order.wave_no = order_data.waveId --order.D_OP_DATE = order_data.orderDate --order.N_PRIORITY = order_data.priority order.note = order_data.memo or "" order.wh_code = CONST_WH order.area_code=" " order.factory=CONST_FACTORY local nRet, result = m3.CreateDataObj(strLuaDEID, order) return nRet, result end -- 创建出库单明细记录 local function create_outbound_detail(strLuaDEID, order_no, item_data) local detail = m3.AllocObject(strLuaDEID, "Outbound_Detail") -- 明细表字段映射 detail.oo_no = order_no detail.storer = item_data.storerId detail.owner = item_data.ownerId detail.row_no = item_data.orderItemId detail.item_code = item_data.skuId detail.item_state = item_data.skuStatus --detail.qty = lua.Get_NumAttrValue(item_data.qty) detail.batch_no = item_data.produceCode detail.wms_bn = item_data.batchNo --detail.D_PRD_DATE = item_data.productDate --detail.D_EXP_DATE = item_data.expiryDate detail.ext_attr3 = item_data.registerNo or "" detail.ext_attr1 = item_data.cid or "" local nRet, result = m3.CreateDataObj(strLuaDEID, detail) return nRet, result end -- isJson传1表示json格式,0表示xml格式 -- value是table数据 -- isStop传0表示正常,3表示要回滚 function ApiReturn(strLuaDEID, isJson, value, isStop) local strReturn = value --Debug( strLuaDEID, debug.getinfo(1), "ApiReturn失败!", value ) --mobox.writeLuaLog( lua.table2str( value ) ) if isJson == 0 then strReturn = xml2lua.toXml(value) mobox.writeLuaLog(strReturn) end mobox.returnValue(strLuaDEID, isJson, value, isStop); return end function Main(strLuaDEID) local nRet, strRetInfo,err_msg local soap_xml,parsed_data,task_data,input_params,task_tb,order_no local strCondition,id,task_items local isStop = 0 local err = {} local items = {} -- m3.PrintLuaDEInfo(strLuaDEID) local result = { flag = "success", code = "0", msg = "" } -- 1. 获取接口输入数据 nRet, soap_xml = mobox.getCurEditDataPacket(strLuaDEID) if nRet ~= 0 then -- lua.Stop(strLuaDEID, "无法获取数据包: " .. soap_xml) result.flag = "failure" result.code = "1" result.msg = "无法获取数据包: " goto api_call_return -- return end -- 2. 解析XML nRet, parsed_data = xml.parse(soap_xml) if nRet ~= 0 then -- lua.Stop(strLuaDEID, "接口输入的XML格式非法!") result.flag = "failure" result.code = "2" result.msg = "接口输入的XML格式非法: " goto api_call_return -- return end -- 3. 提取任务数据 task_data = parsed_data.Envelope.Body.InTaskCreationReq.TaskCreation_Input input_params = task_data.InputParameters task_tb = input_params.TaskCreation_TB -- 4. 检查出库单是否已存在 order_no = task_tb.taskId strCondition = string.format("S_NO = '%s'", order_no) nRet, id, strRetInfo = mobox.getDataObjAttrByKeyAttr(strLuaDEID, "Outbound_Order", strCondition) if nRet > 1 then result.flag = "failure" result.code = "3" result.msg = "检查出库单是否存在时出错: " .. strRetInfo goto api_call_return elseif nRet == 0 then result.flag = "failure" result.code = "4" result.msg = "出库单已存在: " goto api_call_return end -- 5. 创建出库单主表 nRet, strRetInfo = create_outbound_order(strLuaDEID, task_tb) if nRet ~= 0 then -- lua.Stop(strLuaDEID, "创建出库单主表失败:" .. strRetInfo) result.flag = "failure" result.code = "5" result.msg = "创建出库单主表失败:" .. strRetInfo isStop=3 goto api_call_return -- return end -- 6. 处理明细数据 task_items = task_tb.TaskCreation_TB_ITEM -- 情况2:多条明细(数组形式) if task_items[1] ~= nil then items = task_items -- 情况3:单条明细(非数组形式) else items = {task_items} end for i, item in ipairs(items) do nRet, strRetInfo = create_outbound_detail(strLuaDEID, order_no, item) if nRet ~= 0 then err_msg = string.format("创建出库单明细失败(行号:%d): %s", item.orderItemId, strRetInfo) -- wms_base.Warning(strLuaDEID, 1, 604, err_msg, "创建出库单明细") -- nErr = nErr + 1 -- err[nErr] = err_msg -- lua.Stop(strLuaDEID, err_msg) result.flag = "failure" result.code = "5" result.msg = err_msg isStop=3 goto api_call_return end end ::api_call_return:: -- 7. 返回处理结果 -- m3.EPI_Return(strLuaDEID, result) ApiReturn(strLuaDEID, 0, result, isStop) end